package com.example.OnlineStorage.config;

import com.example.OnlineStorage.enums.GlobalVariables_String;
import com.example.OnlineStorage.util.Verify;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

/**
 * 自定义拦截器，用于验证请求的合法性。
 * 主要功能是检查请求头中的令牌，以确保请求来自授权的用户。
 */
@Component
public class CustomInterceptor implements HandlerInterceptor {
	
	// 定义令牌字符串，从全局变量中获取，用于后续的令牌验证。
	private final String TOKEN = GlobalVariables_String.TOKEN.getValue( );
	
	/**
	 * 在请求处理之前进行预处理。
	 * 主要功能是验证请求头中的令牌，对于OPTIONS请求则直接放行。
	 *
	 * @param request  HttpServletRequest对象，代表客户端的请求。
	 * @param response HttpServletResponse对象，用于向客户端发送响应。
	 * @param handler  将要处理请求的具体处理器对象。
	 * @return 如果验证通过，返回true，继续处理请求；否则返回false，终止处理请求。
	 * @throws Exception 如果在处理过程中发生异常，抛出此异常。
	 */
	@Override
	public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception {
		String Path = request.getServletPath();
		String[] segments = Path.split("/");

		// 从请求头中获取令牌。
		String UUID = request.getHeader( TOKEN );
		// 验证令牌的合法性。
		if ( UUID != null ) {
			if ( Verify.VerifyToken( UUID ) ) {
				return true;
			}
		}
		// 对于OPTIONS请求，直接放行。
		if ( request.getMethod( ).equals( "OPTIONS" ) ) {
			return true;
		}
		if (segments.length > 2) {
			if (segments[2].startsWith("Not_verified")) {
				return true;
			}
		}
		response.setContentType( "application/json;charset=utf-8" );
		response.setStatus( 401 );
		PrintWriter out = response.getWriter( );
		out.write( "未登录！" );
		return false;
	}
}
